package sn.gandal.agriculture.agrimobile.j2me.businessObjects;

import java.io.IOException;
import java.util.Vector;
import javax.microedition.lcdui.Display;
import javax.microedition.rms.RecordStoreException;
import sn.gandal.agriculture.agrimobile.j2me.dao.IServiceDAO;
import sn.gandal.agriculture.agrimobile.j2me.dao.ServiceDAOImpl;
import sn.gandal.agriculture.agrimobile.j2me.httpServices.HttpServicesImpl;
import sn.gandal.agriculture.agrimobile.j2me.httpServices.IHttpServices;

/**
 *
 * @author dysow
 */
public class BusinessServicesImpl implements IBusinessServices
{

    IHttpServices httpServices = null;
    IServiceDAO iServiceDAO = null;
    private static BusinessServicesImpl businessServ = null;

    private BusinessServicesImpl(IHttpServices httpServices, IServiceDAO iServiceDAO)
    {
	this.setHttpServices(httpServices);
	this.setIServiceDAO(iServiceDAO);
    }

    private BusinessServicesImpl()
    {
    }

    public static BusinessServicesImpl getInstance()
    {

	if (businessServ == null)
	{
	    businessServ = new BusinessServicesImpl(new HttpServicesImpl(), new ServiceDAOImpl());
	}
	return businessServ;

//	return new BusinessServicesImpl(new HttpServicesImpl(), new ServiceDAOImpl());

    }

    /*
     * Un exemple d'utilisation des services de cette couche
     *
     */
    public Membre[] getAllAbonnes()
    {

	// Le choix qui se pose : pour eviter des lignes de codes pour iterer dans un tableau, pourquoi ne pas iterer dans un Vector?
	//Si changement il y a, il faudra le changer dans le serviceDao
	return iServiceDAO.getAbonneList();
    }

    public boolean receptionListAbonnes(String xml)
    {
	boolean insertion = false;

	//Tout le traitement se ferra ici dans cette classe. Elle peut utiliser une classe utilitaire pour parser le string xml
	//Si tout se passe bien, renvoyer un true
//	httpServices.receptionAbonnes();

	return insertion;
    }

 
    private IHttpServices getHttpServices()
    {
	return httpServices;
    }

    private IServiceDAO getIServiceDAO()
    {
	return iServiceDAO;
    }

    public void setHttpServices(IHttpServices httpServices)
    {
	this.httpServices = httpServices;
    }

    public void setIServiceDAO(IServiceDAO iServiceDAO)
    {
	this.iServiceDAO = iServiceDAO;
    }

    public String validerSauvegardeAbonne(Membre abonne)
    {

	return abonne.validerDetailsAbonne();

    }

    public int getAgentDePeseeIdentifiant() throws RecordStoreException, IOException
    {
	return this.iServiceDAO.getAgentDePeseeIdentifiant();

    }

    public boolean abonneIdExiste(String idAbonne)
    {
	return this.iServiceDAO.abonneIdExiste(idAbonne);
    }

    public boolean ajouterAbonne(Membre abonne)
    {
	return this.iServiceDAO.ajouterAbonne(abonne);
    }

 
//    public void receptionDonnes(DonneeSynchroniserInterface inter) throws Exception
//    {
//	this.httpServices.receptionDonnes(inter);
//    }
//
//    public void envoieDonnes(DonneeSynchroniserInterface inter) throws Exception
//    {
//	this.httpServices.envoieDonnes(inter);
//    }

    public String getAbonneId()
    {
//	Membre abonne = new Membre();
//	return Integer.toString(abonne.getIdAbonne());

	return this.iServiceDAO.getAbonneId();
    }

   

    public String validateRechercheAbonne(Membre abonne)
    {
	return abonne.validerRechercheAbonne();
    }

    public Membre[] getRechercheAbonneList(int abonneId, String prenom, String nom, String prenomMere, String nomMere)
    {
	return iServiceDAO.getRechercheAbonneList(abonneId, prenom, nom, prenomMere, nomMere);
    }

    public boolean modifierAbonne(Membre abonne)
    {
	return this.iServiceDAO.modifierAbonne(abonne);
    }

    public boolean supprimerAbonne(int abonneIdInt)
    {
	return this.iServiceDAO.supprimerAbonne(abonneIdInt);
    }

    public boolean isAbonneLoaded()
    {
	//  throw new UnsupportedOperationException("Not supported yet.");
	return true;
    }


    public void deleteAllData()
    {
	this.iServiceDAO.deleteAllData();
    }

    public void reinitialiserAbonneList(Vector vecAbonneList) throws RecordStoreException, IOException
    {
	this.iServiceDAO.reinitialiseAbonneList(vecAbonneList);
    }

    public Membre getAbonneDetails(int idAbonneInt)
    {
	return iServiceDAO.getAbonneDetails(idAbonneInt);
    }

    public String validerChampsAbonne(String telephonePayeur, String telephone)
    {
	Membre abonne = new Membre();
	return abonne.validerChampsAbonne(telephonePayeur, telephone);
    }

//    public void testerConnexion(ProgressForm progressForm, Display display)
//    {
//	this.httpServices.testerConnexion(progressForm, display);
//    }

    public String statutConnexion()
    {
	StatutConnexion statutConnexion = new StatutConnexion();
	return statutConnexion.getDisplay();
    }


    public String validerDates(Membre newAbonne)
    {
	return newAbonne.validateDates();
    }

    public void saveWebAdresse(Adresse adresse) throws RecordStoreException, IOException
    {
	this.iServiceDAO.saveWebAdress(adresse);
    }

    public String validerChampsEditAbonne(String telephonePayeur, String telephone)
    {
	Membre abonne = new Membre();
	return abonne.validerChampsEditAbonne(telephonePayeur, telephone);
    }

    public Membre[] getListeAbonnesModifies() throws RecordStoreException, IOException
    {
	//desabonné automatique
	return this.iServiceDAO.getListAbonnesModifies();
    }

    public boolean isAbonneWeighedToday(int idAbonne)
    {
	System.out.println("Testonjs voir si l'abonné a été pesé auj : couche business");
	return iServiceDAO.isAbonneWeighedToday(idAbonne);


    }

  
    public void updateIdentifiantsStore() throws RecordStoreException, IOException {
        
        Membre[] listAb=iServiceDAO.getAbonneList();
        System.out.println("Nombre d'abonnés receptionnés : "+listAb.length);
        Vector vectorAb=new Vector();
        for(int i=0; i<listAb.length;i++){
            vectorAb.addElement(listAb[i]);
        }
        System.out.println("Taille du vecteur receptionné : "+vectorAb.size());
   //   try {
            iServiceDAO.updateIdentifiantsStore(vectorAb);
//        } catch (RecordStoreException ex) {
//            ex.printStackTrace();
//        } catch (IOException ex) {
//            ex.printStackTrace();
//        }
    }

     public void updateIdentifiantsStore(Vector vector) throws RecordStoreException, IOException {

        System.out.println("Taille du vecteur receptionné : "+vector.size());
   //   try {
            iServiceDAO.updateIdentifiantsStore(vector);
//        } catch (RecordStoreException ex) {
//            ex.printStackTrace();
//        } catch (IOException ex) {
//            ex.printStackTrace();
//        }
    }

    public int generateNewAbonneId() {
        return iServiceDAO.generateNewAbonneId();
    }

    public boolean isAbonnesLoaded(){
        boolean load=false;
        System.out.println("BusinessImpl() : existe-t-il un abonné en base ? :");
        try {
            load= iServiceDAO.isAbonnesLoaded();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
      return load;
    }

    public Adresse getAdresseEnregistree() throws RecordStoreException, IOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public boolean agentDePeseeExists(String adpId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void reinitialiserConvocationList(Vector vector) throws RecordStoreException, IOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }


}
